Request re-coalescing for qcow disks. qcow driver had the habit of breaking each
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 17 Dec 2009 06:27:56 +0000 (06:27 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 17 Dec 2009 06:27:56 +0000 (06:27 +0000)
(4K) block read into 8 (512 bytes) sector reads. This is inefficient, but also
prevents sharing detector from working, as it is based on page-size reads.

Signed-off-by: Grzegorz Milos <Grzegorz.Milos@citrix.com>
tools/blktap2/drivers/block-qcow.c

index e0590ae59bce6475460ab375ebf1830cb74ff359..13d6c324ea1948a3486a7db229b9083d76bb6f94 100644 (file)
@@ -1035,6 +1035,17 @@ void tdqcow_queue_read(td_driver_t *driver, td_request_t treq)
                }
                
                if(!cluster_offset) {
+            int i;
+            /* Forward entire request if possible. */
+            for(i=0; i<nb_sectors; i++)
+                if(get_cluster_offset(s, (sector+i) << 9, 0, 0, 0, 0))
+                    goto coalesce_failed;
+            treq.buf  = buf;
+            treq.sec  = sector;
+            treq.secs = nb_sectors;
+                       td_forward_request(treq);
+            return;
+coalesce_failed:            
                        treq.buf  = buf;
                        treq.sec  = sector;
                        treq.secs = n;